package com.easy.order.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easy.common.bean.OrderItem;
import com.easy.common.service.OrderItemService;
import com.easy.common.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController // 自动返回JSON，无需额外@ResponseBody
@RequestMapping("/order/item") // 接口统一前缀，区分资源
@CrossOrigin(origins = "*", maxAge = 3600) //解决前后端跨域（生产环境需指定具体域名）
public class OrderItemController {

    // 注入子订单服务（与Service层实现匹配）
    @Autowired
    private OrderItemService orderItemService;

    /**
     * 1. 根据ID查询子订单
     * 请求方式：GET
     * 请求路径：/api/order-item/1（1为子订单ID）
     * 成功响应：code=200, msg=空, data=子订单对象
     * 失败响应：code=404, msg=子订单不存在或已删除
     */
    @GetMapping("/{id}")
    public Result getOrderItemById(@PathVariable Integer id) {
        // 1. 校验参数（ID非空）
        if (id == null) {
            return Result.fail(400, "子订单ID不能为空");
        }
        // 2. 调用Service查询（自动过滤已软删除数据）
        OrderItem orderItem = orderItemService.getOrderItemById(id);
        // 3. 封装响应结果
        return orderItem != null
                ? Result.success(orderItem) // 成功：返回数据
                : Result.fail(404, "子订单不存在或已删除"); // 失败：404提示
    }

    /**
     * 2. 根据商品名称查询子订单（精确匹配）
     * 请求方式：GET
     * 请求路径：/api/order-item/name/华为手机（"华为手机"为商品名称）
     */
    @GetMapping("/name/{productName}")
    public Result getOrderItemByName(@PathVariable String productName) {
        // 1. 校验参数（商品名称非空）
        if (productName == null || productName.trim().isEmpty()) {
            return Result.fail(400, "商品名称不能为空");
        }
        // 2. 调用Service查询
        OrderItem orderItem = orderItemService.getOrderItemByName(productName.trim());
        // 3. 封装响应
        return orderItem != null
                ? Result.success("查询成功", orderItem) // 带自定义成功提示
                : Result.fail(404, "未找到该商品名称的子订单");
    }

    /**
     * 3. 新增子订单
     * 请求方式：POST
     * 请求路径：/api/order-item
     * 请求体：JSON格式（需包含orderId、productId、quantity等核心字段）
     */
    @PostMapping
    public Result addOrderItem(@RequestBody OrderItem orderItem) {
        // 1. 校验参数（对象非空）
        if (orderItem == null) {
            return Result.fail(400, "子订单数据不能为空");
        }
        // 2. 调用Service新增（返回1=成功，0=失败）
        int addResult = orderItemService.addOrderItem(orderItem);
        // 3. 封装响应
        return addResult == 1
                ? Result.success("新增子订单成功") // 无数据返回，仅提示
                : Result.fail(500, "新增子订单失败，请检查核心字段（总订单ID/商品ID/数量）");
    }

    /**
     * 4. 更新子订单
     * 请求方式：PUT
     * 请求路径：/api/order-item
     * 请求体：JSON格式（必须包含id，否则更新失败）
     */
    @PutMapping
    public Result updateOrderItem(@RequestBody OrderItem orderItem) {
        // 1. 校验核心参数（ID非空）
        if (orderItem == null || orderItem.getId() == null) {
            return Result.fail(400, "子订单ID不能为空");
        }
        // 2. 调用Service更新
        int updateResult = orderItemService.updateOrderItem(orderItem);
        // 3. 封装响应
        return updateResult == 1
                ? Result.success("更新子订单成功")
                : Result.fail(404, "更新失败：子订单不存在或已删除");
    }

    /**
     * 5. 软删除子订单（标记isdel=1，不物理删除）
     * 请求方式：DELETE
     * 请求路径：/api/order-item/1（1为子订单ID）
     */
    @DeleteMapping("/{id}")
    public Result deleteOrderItem(@PathVariable Integer id) {
        // 1. 校验参数
        if (id == null) {
            return Result.fail(400, "子订单ID不能为空");
        }
        // 2. 调用Service软删除
        int deleteResult = orderItemService.deleteOrderItem(id);
        // 3. 封装响应
        return deleteResult == 1
                ? Result.success("软删除子订单成功")
                : Result.fail(404, "删除失败：子订单不存在或已删除");
    }

    /**
     * 6. 多条件查询子订单列表（支持按总订单ID/商品ID/秒杀活动ID筛选）
     * 请求方式：GET
     * 请求路径：/api/order-item/list?orderId=10&productId=20（参数可选，不传则查全部）
     */
    @GetMapping("/list")
    public Result getAllOrderItem(
            // 可选筛选参数：用@RequestParam接收，required=false表示非必传
            @RequestParam(required = false) Integer orderId,
            @RequestParam(required = false) Integer productId,
            @RequestParam(required = false) Integer seckillActivityId,
            @RequestParam(required = false) String orderNo) {
        // 1. 构建查询条件对象（非空参数才会参与筛选）
        OrderItem queryParam = new OrderItem();
        queryParam.setOrderId(orderId);
        queryParam.setProductId(productId);
        queryParam.setSeckillActivityId(seckillActivityId);
        queryParam.setOrderNo(orderNo);

        // 2. 调用Service查询列表（自动过滤已删除数据）
        List<OrderItem> orderItemList = orderItemService.getAll(queryParam);

        // 3. 封装响应（即使列表为空，也返回200+空列表，避免前端处理404）
        return Result.success("查询子订单列表成功", orderItemList);
    }

    /**
     * 7. 分页查询子订单（支持筛选+分页）
     * 请求方式：GET
     * 请求路径：/api/order-item/page?current=1&size=10&orderNo=2024（current=页码，size=每页条数）
     */
    @GetMapping("/page")
    public Result getOrderItemPage(
            // 分页参数：默认值（current=1，size=10），避免前端不传参导致异常
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            // 可选筛选参数
            @RequestParam(required = false) Integer orderId,
            @RequestParam(required = false) String orderNo,
            @RequestParam(required = false) String productName) {
        // 1. 构建MyBatis-Plus分页对象（current=当前页，size=每页条数）
        IPage<OrderItem> page = new Page<>(current, size);

        // 2. 构建筛选条件对象
        OrderItem queryParam = new OrderItem();
        queryParam.setOrderId(orderId);
        queryParam.setOrderNo(orderNo);
        queryParam.setProductName(productName);

        // 3. 调用Service分页查询（返回IPage，包含总条数、总页数、当前页数据）
        IPage<OrderItem> resultPage = orderItemService.getPage(queryParam, page);

        // 4. 封装响应（返回分页对象，前端可直接用于分页控件）
        return Result.success("分页查询子订单成功", resultPage);
    }
}